package com.cy.store.service.impl;

import com.cy.store.entity.Cart;
import com.cy.store.entity.Product;
import com.cy.store.mapper.CartMapper;
import com.cy.store.mapper.ProductMapper;
import com.cy.store.service.ICartService;
import com.cy.store.service.ex.AccessDeniedException;
import com.cy.store.service.ex.CartNotFoundException;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.UpdateException;
import com.cy.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

/*
 * @Author: jun
 * @Date:2022/11/13 9:47
 * @概述：
 */
@Service
public class CartServiceImpl implements ICartService {
    //购物车的业务层依赖于购物车的持久层以及商品的持久层
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductMapper productMapper;

    @Override
    public void addToCart(Integer uid, Integer pid,
                          Integer amount, String username) {
        //查询当前要添加的这个购物车是否在表中已存在
        Cart result = cartMapper.findByUidAndPid(uid, pid);
        Date date = new Date();
        //获取购物车id
        Integer cid = result.getCid();
        if (result==null){  //表示这个商品从来没有被添加到购物车中，则进行新增操作
            Cart cart = new Cart();
            //将用户数据传递给cart
            cart.setUid(uid);
            cart.setUid(pid);
            //这里的amount比较特殊，前端和后端数据库的数据需要同步
            cart.setUid(amount);

            //从productMapper中调用方法获取商品价格；
            Product product = productMapper.findById(pid);
            cart.setPrice(product.getPrice());

            //日志补全
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);  //date已经在上面new好了
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);

            Integer rows = cartMapper.insert(cart);
            if (rows != 1){
                //插入的条数不为一说明没有成功
                throw new InsertException("插入数据时出现未知的异常");
            }
        }else{//表示当前的商品在购物车中已经存在

            //从查询结果中取出原数量，与参数amount相加，得到新的数量
            Integer num = result.getNum() + amount;//加入购物车时只会有+不可能有-

            Integer rows = cartMapper.updateNumByCid(
                    cid,
                    num,
                    username,
                    date);
            if (rows != 1) {
                throw new InsertException("更新数据时产生未知异常");
            }
        }
    }

    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        return cartMapper.findVOByUid(uid);
    }

    @Override
    public Integer addNum(Integer cid, Integer uid, String username) {
        Cart result = cartMapper.findByCid(cid);
        if (result==null){
            throw new CartNotFoundException("数据不存在");
        }
        if (!result.getUid().equals(uid)){
            throw new AccessDeniedException("数据访问错误");
        }

        Integer num = result.getNum()+1;
        Integer rows = cartMapper.updateNumByCid(cid, num, username, new Date());
        if (rows!=1){
            throw new UpdateException("数据更新失败");
        }

        //返回新的购物车数据总量
        return num;

    }

    @Override
    public List<CartVO> getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> list = cartMapper.findVOByCids(cids);

        //迭代器遍历
        Iterator<CartVO> iterator = list.iterator();
        while (iterator.hasNext()){
            CartVO cart = iterator.next();
            if (!cart.getUid().equals(uid)){
                iterator.remove();//不使用list.remove(cart),在迭代器遍历不能使用集合移除，用迭代器自己的方法
            }
        }
        return list;
    }

}
